#include"head.h"

MYSQL* mysql_op(char buf[16])               //打开数据库
{
    MYSQL* mysql=mysql_init(NULL);
    if(mysql==NULL)
    {
        puts(mysql_error(mysql));
        mysql_close(mysql);
        return 0;
    }

    mysql_set_character_set(mysql,"utf8");      //设置当前连接数据库的操作字符集为中文字符集

    if(mysql_real_connect(mysql,"localhost","root","123456",buf,0,NULL,0)==NULL)
    {
        printf("打开数据库失败\n");
        mysql_error(mysql);
        mysql_close(mysql);
        return 0;
    }
    return mysql;
}

MYSQL_RES * mysql_result(MYSQL**mysql)      //获得结果集
{
    MYSQL_RES *result;
    if((result=mysql_store_result(*mysql))==NULL)          //4.存储结果集到result中
    {                                                      //这个result用完需要释放空间
        printf("%s\n",mysql_error(*mysql));
        mysql_free_result(result);
        return result;
    }
    return result;
}

void mysql_judge(int sockfd,int rnum,char* buf)     //判断录入、更新、删除成功否
{
    char buf_1[16];
    char buf_2[16];
    if(strcmp(buf,"删除")==0)
    {
        printf("删除该进这里\n");
        sprintf(buf_2,"%s成功",buf);
        sprintf(buf_1,"%s失败",buf);
    }
    else
    {
        sprintf(buf_1,"%s成功",buf);
        sprintf(buf_2,"%s失败",buf);
    }
    if((int)rnum>=1) 
    {
        if(send(sockfd,buf_1,16,0)<0)
        {
            perror("send");
            return ;
        }
    }
    else
    {
        if(send(sockfd,buf_2,16,0)<0)
        {
            perror("send");
            return ;
        }
    }
    return ;
}

void mysql_flow_id(int sockfd,MYSQL** mysql,int id) //数据库flow表中进行所有id查询
{
    char query[48]={0};
    char buf[5];
    char buf_1[16];
    printf("查询的id=%d\n",id);
    sprintf(query,"select f_id from flow where u_id=%d",id);
    if(mysql_real_query(*mysql,query,strlen(query))) 
    {                                                   
        printf("%s\n",mysql_error(*mysql));
        return ;
    }
    MYSQL_RES *result=mysql_result(mysql);      //拿到结果集

    my_ulonglong rnum =mysql_num_rows(result);
    int n=(int)rnum;
    sprintf(buf,"%d",n);
    if(send(sockfd,buf,5,0)<0)         //服务器回复查询到的单号有几个
    {
        perror("send");
        mysql_free_result(result);
        return ;
    }
    if(n==0)
    {
        mysql_free_result(result);
        return ;
    }

    MYSQL_ROW row;
    for(int j=0;j<rnum;j++)
    {
        row=mysql_fetch_row(result);
        strcpy(buf_1,row[0]);
        if(send(sockfd,buf_1,16,0)<0)
        {
            perror("send");
            mysql_free_result(result);
            return ;
        }
    }

    mysql_free_result(result);
    return ;
}

void data_flow_id(int sockfd,int id)        //查询所有订单id
{
    char buf[16]={"物流用户"};
    MYSQL* mysql=mysql_op(buf);
    mysql_flow_id(sockfd,&mysql,id);    //进行查询单号并循环发送
    mysql_close(mysql);
    return ;
}

void mysql_point(int sockfd,MYSQL** mysql,char* buf_1)  //数据库point表中进行物流点查询
{
    char query[56]={0};
    char buf[5];
    sprintf(query,"select *from point where district='%s'",buf_1);
    if(mysql_real_query(*mysql,query,strlen(query))) 
    {                                                   
        printf("%s\n",mysql_error(*mysql));
        return ;
    }
    MYSQL_RES *result=mysql_result(mysql);

    my_ulonglong rnum =mysql_num_rows(result);          //获取记录数量
    if((int)rnum<1)
    {
        point q;
        strcpy(q.district,"无");
        printf("未找到相关区域附近的物流点\n");
        if(send(sockfd,&q,sizeof(point),0)<0)        
        {
            perror("send");
            return ;
        }
    }
    else
    {
        MYSQL_ROW row;
        point p;
        row=mysql_fetch_row(result);
        strcpy(p.district,row[0]);
        strcpy(p.film,row[1]);
        p.phone=atoi(row[2]);
        strcpy(p.location,row[3]);
        if(send(sockfd,&p,sizeof(p),0)<0)         //将查得到的物流点信息发送过去
        {
            perror("send");
            mysql_free_result(result);
            return ;
        }
    }

    mysql_free_result(result);
    return ;
}

void data_point(int sockfd,char* buf_1)     //查询附近物流点
{
    char buf[16]={"物流用户"};
    MYSQL* mysql=mysql_op(buf);
    mysql_point(sockfd,&mysql,buf_1);       //数据库查询附近的物流点
    mysql_close(mysql);
    return ;
}

void fee_caculate(int sockfd,MYSQL_ROW row)
{
    int a,b;
    char buf[16]={"物流用户"};
    char query[96];
    char query_1[56];
    fee q;
    MYSQL* mysql=mysql_op(buf);
    MYSQL_ROW row_1;
    strcpy(q.time,row[2]);
    strcpy(q.film,row[3]);          //这个放在下面获取结果集之后会转储

    sprintf(query,"select distance from fee where location='%s' || location='%s'",row[0],row[1]);
    printf("%s\n",query);
    if(mysql_real_query(mysql,query,strlen(query))) 
    {                                                  
        printf("%s\n",mysql_error(mysql));
        return ;
    }
    MYSQL_RES* result=mysql_result(&mysql);
    row_1=mysql_fetch_row(result);
    
    printf("row_1%s\n",row_1[0]);
    printf("%s\n",row_1[0]);
    a=atoi(row_1[0]);
    row_1=mysql_fetch_row(result);
    b=atoi(row_1[0]);
    if(a>b){
        q.c=a-b;
        send(sockfd,&q,sizeof(fee),0);
    }
    else if(a<b){
        q.c=b-a;
        send(sockfd,&q,sizeof(fee),0);
    }
    else{
        q.c=1;
        send(sockfd,&q,sizeof(fee),0);
    }
    mysql_free_result(result);
    mysql_close(mysql);
    return ;
}

MYSQL_ROW mysql_fee(int sockfd,MYSQL**mysql,char*buf)
{
    char query[56];
    MYSQL_ROW row=NULL;
    sprintf(query,"select ori,end,time,film from flow where f_id=%d",atoi(buf));
    if(mysql_real_query(*mysql,query,strlen(query))) 
    {                                                   
        printf("%s\n",mysql_error(*mysql));
        return row;
    }
    MYSQL_RES* result=mysql_result(mysql);
    row=mysql_fetch_row(result);
    mysql_free_result(result);
    return row;
}

void data_fee(int sockfd,char*buf)
{
    char buf_1[16]={"物流用户"};
    MYSQL* mysql=mysql_op(buf_1);
    MYSQL_ROW row=mysql_fee(sockfd,&mysql,buf);
    if(row==NULL)
    {
        fee q;
        q.c=-1;
        send(sockfd,&q,sizeof(fee),0);
        return ;
    }
    mysql_close(mysql);
    fee_caculate(sockfd,row);
    return ;
}


void mysql_location(int sockfd,MYSQL** mysql,char* buf) //数据库flow表中进行物流更新查询
{
    char query[72]={0};
    sprintf(query,"select location,situation from flow where f_id=%d",atoi(buf));
    if(mysql_real_query(*mysql,query,strlen(query))) 
    {                                                   
        printf("%s\n",mysql_error(*mysql));
        return ;
    }
    MYSQL_RES *result=mysql_result(mysql);

    my_ulonglong rnum =mysql_num_rows(result);          //获取记录数量
    if((int)rnum<1)
    {
        trace p;
        p.id=0;
        printf("未追踪到物流位置\n");
        if(send(sockfd,&p,sizeof(trace),0)<0)        
        {
            perror("send");
            mysql_free_result(result);
            return ;
        }
    }
    else
    {
        trace q;
        MYSQL_ROW row;
        row=mysql_fetch_row(result);
        q.id=1;
        strcpy(q.location,row[0]);
        strcpy(q.status,row[1]);
        if(send(sockfd,&q,sizeof(trace),0)<0)         //将查得到的物流点信息发送过去
        {
            perror("send");
            mysql_free_result(result);
            return ;
        }
    }
    mysql_free_result(result);    
    return ;
}

void data_flow_location(int sockfd,char* buf)      //更新物流信息
{
    char buf_1[16]={"物流用户"};
    MYSQL* mysql=mysql_op(buf_1);
    mysql_location(sockfd,&mysql,buf);
    mysql_close(mysql);
    return ;
}

int mysql_delete(MYSQL** mysql, int id)
{
    char query[32] = {0};
    sprintf(query, "delete from info where id=%d", id);

    if (mysql_real_query(*mysql, query, strlen(query))) // mysql_real_query()函数是执行sql操作语句的函数
    {                                                   // 3.查询表（argv[2]）的所有数据
        printf("%s\n", mysql_error(*mysql));
        //mysql_close(*mysql);
        return -1;
    }
    printf("删除成功\n");
    return 1;
}

int mysql_modfiy(MYSQL **mysql, char a[16], int id)
{
    char query[83] = {0};
    sprintf(query, "update info set passwd='%s' where id=%d", a, id);
    if (mysql_real_query(*mysql, query, strlen(query))) // mysql_real_query()函数是执行sql操作语句的函数
    {                                                   // 3.查询表（argv[2]）的所有数据
        printf("%s\n", mysql_error(*mysql));
        //mysql_close(*mysql);
        return -1;
    }
    printf("修改密码成功\n");
    return 1;
}


void mysql_adm_search(int sockfd,MYSQL** mysql)             //数据库flow表中进行所有数据查询(发送)
{
    char query[24]={0};
    char buf_2[4];
    sprintf(query,"select * from flow");
    if(mysql_real_query(*mysql,query,strlen(query))) 
    {                                                   
        printf("%s\n",mysql_error(*mysql));
        return ;
    }
    MYSQL_RES *result=mysql_result(mysql);                  //拿到结果集

    my_ulonglong rnum =mysql_num_rows(result);              //获得记录数量
    sprintf(buf_2,"%d",(int)rnum);
    if(send(sockfd,buf_2,4,0)<0)         //服务器发送订单总数
    {
        perror("send");
        mysql_free_result(result);
        return ;
    }
    if((int)rnum<1)
    {
        mysql_free_result(result);
        return ;
    }
    else
    {

        MYSQL_ROW row;
        for(int i=0;i<rnum;i++)
        {
            row=mysql_fetch_row(result);
            flow_deliver(sockfd,row);
        }
    }
    mysql_free_result(result);
    return ;

}

void flow_deliver(int sockfd ,MYSQL_ROW row)        //发送一条订单信息
{
    flow p;
    p.f_id=atoi(row[0]);
    p.u_id=atoi(row[1]);
    strcpy(p.origin,row[2]);
    strcpy(p.end,row[3]);
    strcpy(p.del,row[4]);
    strcpy(p.rec,row[5]);
    strcpy(p.time,row[6]);
    strcpy(p.loc,row[7]);
    strcpy(p.film,row[8]);
    strcpy(p.sit,row[9]);
    if(send(sockfd,&p,sizeof(flow),0)<0)
    {
        perror("send");
        printf("发送出错\n");
        return ;
    }
    return ;
}


void adm_flow_search(int sockfd)                    //adm查询所有id
{
    char buf_1[16]={"物流用户"};
    MYSQL* mysql=mysql_op(buf_1);
    mysql_adm_search(sockfd,&mysql);
    mysql_close(mysql);
    return ;
}

void mysql_adm_recv(int sockfd,MYSQL**mysql,flow* q)    //数据库flow中进行订单录入
{
    char buf[8]={"录入"};
    char query[255];
    char query_1[46];
    sprintf(query,"insert into flow(f_id,u_id,ori,end,del,rec,time,location,film,situation) values(%d,%d,'%s','%s','%s','%s','%s','%s','%s','%s')"
,q->f_id,q->u_id,q->origin,q->end,q->del,q->rec,q->time,q->loc,q->film,q->sit);
    if(mysql_real_query(*mysql,query,strlen(query))) 
    {       
        printf("订单录入失败\n");                                            
        printf("%s\n",mysql_error(*mysql));
        if(send(sockfd,"录入失败",16,0)<0)
        {
            perror("send");
            return ;
        }
        return ;
    }
    sprintf(query_1,"select f_id from flow where f_id=%d",q->f_id);
    if(mysql_real_query(*mysql,query_1,strlen(query_1))) 
    {       
        printf("订单录入失败\n");                                            
        printf("%s\n",mysql_error(*mysql));
        return ;
    }
    MYSQL_RES * result=mysql_result(mysql);
    my_ulonglong rnum =mysql_num_rows(result);
    mysql_judge(sockfd,(int)rnum,buf);          //判断是否成功
    mysql_free_result(result);
    return ;
}

void adm_recv_flow(int sockfd)                      //adm录入新的订单信息
{
    flow q;
    if(recv(sockfd,&q,sizeof(flow),0)<0)
    {
        perror("recv");
        printf("录入失败\n");
        return;
    }
    char buf_1[16]={"物流用户"};
    MYSQL* mysql=mysql_op(buf_1);
    mysql_adm_recv(sockfd,&mysql,&q);
    mysql_close(mysql);
    return ;
}


void mysql_adm_update(int sockfd,MYSQL** mysql,flow* q) //数据库flow中进行订单录入
{
    char buf[8]={"更新"};
    char query[81];
    char query_1[64];
    sprintf(query,"update flow set location='%s',situation='%s' where f_id=%d",q->loc,q->sit,q->f_id);
    if(mysql_real_query(*mysql,query,strlen(query))) 
    {       
        printf("更新录入失败\n");                                            
        printf("%s\n",mysql_error(*mysql));
        if(send(sockfd,"更新失败",16,0)<0)
        {
            perror("send");
            return ;
        }

        return ;
    }
    sprintf(query_1,"select f_id from flow where location='%s' && f_id=%d",q->loc,q->f_id);
    if(mysql_real_query(*mysql,query_1,strlen(query_1))) 
    {       
        printf("更新录入失败\n");                                            
        printf("%s\n",mysql_error(*mysql));
        return ;
    }
    MYSQL_RES * result=mysql_result(mysql);
    my_ulonglong rnum =mysql_num_rows(result);
    /* if((int)rnum>=1) 
    {
        if(send(sockfd,"更新成功",16,0)<0)
        {
            perror("send");
            mysql_free_result(result);
            return ;
        }
    }
    else
    {
        if(send(sockfd,"更新失败",16,0)<0)
        {
            perror("send");
            mysql_free_result(result);
            return ;
        }
    } */
    mysql_judge(sockfd,(int)rnum,buf);
    mysql_free_result(result);
    return ;
}

void adm_uodate_flow(int sockfd)                    //adm更新物流订单信息
{
    flow q;
    if(recv(sockfd,&q,sizeof(flow),0)<0)
    {
        perror("recv");
        printf("更新失败\n");
        return;
    }
    char buf_1[16]={"物流用户"};
    MYSQL* mysql=mysql_op(buf_1);
    mysql_adm_update(sockfd,&mysql,&q);
    mysql_close(mysql);
    return ;
}


void mysql_adm_delete(int sockfd,MYSQL** mysql,char*buf) //数据库flow表中进行删除订单
{
    char buf_1[8]={"删除"};
    char query[81];
    char query_1[52];
    sprintf(query,"delete from flow where f_id=%d",atoi(buf));
    if(mysql_real_query(*mysql,query,strlen(query))) 
    {       
        printf("更新录入失败\n");                                            
        printf("%s\n",mysql_error(*mysql));
        return ;
    }

   
    sprintf(query_1,"select f_id from flow where f_id=%d",atoi(buf));
    if(mysql_real_query(*mysql,query_1,strlen(query_1))) 
    {       
        printf("更新录入失败\n");                                            
        printf("%s\n",mysql_error(*mysql));
        return ;
    }

    MYSQL_RES *result=mysql_result(mysql);
    my_ulonglong rnum =mysql_num_rows(result);
/*     if((int)rnum==0) 
    {
        if(send(sockfd,"删除成功",16,0)<0)
        {
            perror("send");
            mysql_free_result(result);
            return ;
        }
    }
    else
    {
        if(send(sockfd,"删除失败",16,0)<0)
        {
            perror("send");
            mysql_free_result(result);
            return ;
        }
    } */
    mysql_judge(sockfd,(int)rnum,buf_1);
    mysql_free_result(result);
    return ;

}

void adm_delete_flow(int sockfd)                    //adm删除订单信息
{
    char buf[16];
    if(recv(sockfd,buf,16,0)<0)
    {
        perror("recv");
        printf("删除失败\n");
        return ;
    }
    char buf_1[16]={"物流用户"};
    MYSQL* mysql=mysql_op(buf_1);
    mysql_adm_delete(sockfd,&mysql,buf);
    mysql_close(mysql);
    return ;
}